/*
    @2023-09-20：在DAISY_Config中新增dump_dir，用于保存“输出参数配置文件的路径”，
                 便于后面实现对某个芯片的单个寄存器进行更新配置（具体功能暂未实现）
    @2023-09-16：通过SPI配置菊花链构型的"ADG714--DACx0508--DACx0508"芯片,
                 将原先的DACx0508配置程序删减掉单芯片模式的部分
*/

//  DAISY
//  SPI data format for DAISY 24bits in total
//  |R/W|Re2|Re1|Re0|A3|A2|A1|A0|D15|D14|...|D5|D4|D3|D2|D1|D0| 
//  Re == reserved

#include <stdio.h>
#include <stdlib.h>

#include "COMMON.h"
#include "SPI.h"
#include "ADG714.h"
#include "DACx0508.h"

#ifndef _DAISY_H_
#define _DAISY_H_

#define _VOD_MIN_   10.0

typedef struct _DAISY_Config{

    int update_adg714;
    int update_dacx0508_a;
    int update_dacx0508_b;

    ADG714_Config   *adg714;
    DACx0508_Config *dacx0508_a;
    DACx0508_Config *dacx0508_b;

    char dump_dir[1024];    // 保存用于输出参数配置文件的路径

} DAISY_Config;

//  initialize to defaults
void init_daisy_config( DAISY_Config *cfg );

void free_daisy_config( DAISY_Config *cfg );

//  将配置参数保存到磁盘上制定目录下
void dump_daisy_config( DAISY_Config *cfg, char *dump_filename );

//  复制daisy_config
void duplicate_daisy_config( DAISY_Config *cfg_old, DAISY_Config *cfg_new );

//  read daisy configuration data from *inifile
int read_daisy_config( DAISY_Config *cfg, char *inifile );

//  print daisy configurations for debug
int print_daisy_config( DAISY_Config *cfg );

//  update configuration for a 'opt' with value 'opt_val'
int update_daisy_config( DAISY_Config *cfg, char *chip, char* opt,  int opt_val );

int config_daisy_via_SPI(   uint32_t *gpio_reg, 
					        uint32_t *gpio2_reg, 
					        uint32_t *gpio_in_reg,
					        SPI_CONFIG *spi_config,
					        DAISY_Config *cfg,
                            uint32_t state,
                            int verbose
					        );

int set_reg_update_option(  DAISY_Config *cfg,
                            uint32_t *gpio_reg );

// void get_reg_data( 	DAISY_Config *cfg, 
// 					uint32_t *reg_adg714,
// 					uint32_t *reg_dacx0508_a,
// 					uint32_t *reg_dacx0508_b,
// 					int reg_idx,	// apply to DACx0508 only
// 					int state,		// 1: power up; 0: power down
// 					double scale
// 					);

int daisy_update_reg(   char *chip_name,
                        uint32_t *reg_addr,
                        uint32_t *reg_value );

// 将VOD从10V恢复至29V
int restore_OD_bias_voltage(    uint32_t *gpio_reg, 
                                uint32_t *gpio2_reg, 
                                uint32_t *gpio_in_reg,
                                SPI_CONFIG *spi_config,
                                DAISY_Config *cfg
                             );
// 将VOD从29V降至10V
int lower_OD_bias_voltage(  uint32_t *gpio_reg, 
                            uint32_t *gpio2_reg, 
                            uint32_t *gpio_in_reg,
                            SPI_CONFIG *spi_config,
                            DAISY_Config *cfg
                            );

// the following two are the same as the above two, but are to be used inside socket service.
// int restore_OD_bias_voltage_socket();
// int lower_OD_bias_voltage_socket();

#endif // _DAISY_H_
